package locations

import java.util.Date;
import java.util.logging.Logger;
import src.de.checker.hochzeit.domain.util.*;
import src.de.checker.hochzeit.domain.user.*;
import src.de.checker.hochzeit.domain.location.*;
import src.de.checker.hochzeit.konstanten.*
import src.de.checker.hochzeit.util.*;
import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOptions.Builder.*
/**
 * Verwaltet die Funktionen, die für die Checkliste nötig sind.
 */
Logger log = Logger.getLogger('LocationController');

def myuser = session.getAttribute(Konstanten.SESSION_USER);
int asc = -1;
int desc = 1;

if(myuser != null)
{
	if(params?.index ==~ /(?i)true/)
	{
		index()
	}
	if(params?.create ==~ /(?i)true/)
	{
		create()
	}
	if(params?.save ==~ /(?i)true/)
	{
		save()
	}
	if(params?.delete ==~ /(?i)true/)
	{
		delete()
	}
	if(params?.update ==~ /(?i)true/)
	{
		update()
	}
	if(params?.edit ==~ /(?i)true/)
	{
		edit()
	}
	
}
private void index()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER);
	String feier = myuser.feier
	
	String sort = "name"
	int order = getOrder()
	
	if(params.sort)
		sort = params.sort
	
	//Alle bereits gespeicherten Locations für die Feier suchen
	def query = new Query(Konstanten.LOCATION)
	query.addFilter("feier", Query.FilterOperator.EQUAL, feier)
	query.addFilter("active", Query.FilterOperator.EQUAL, true)
	if(!sort.equals(''))
	{
		if(order == -1)
			query.addSort(sort, Query.SortDirection.ASCENDING)
		else
			query.addSort(sort, Query.SortDirection.DESCENDING)
	}		
	PreparedQuery preparedQuery = datastore.prepare(query)
 	def entities = preparedQuery.asList( withLimit(300) )
 	request['list'] = entities
 	request['order'] = order;
 	forward '/locations/index.gtpl'
}
/**
 * Speichert eine Location für die Feier des
 * angemeldeten Benutzers
 */
private void save()
{
	if(!params.name)
	{
		request.message = 'Bitte Namen angeben'
		forward '/locations/create.gtpl'
	}
	else
	{
		def myuser = session.getAttribute(Konstanten.SESSION_USER);
		
		Location l = new Location()
		l.name = params.name
		l.anmerkung = params.anmerkung
		l.adresse = params.adresse
		l.ansprechpartner = params.ansprechpartner
		l.telefon = params.telefon
		if(params.homepage)
		{
			String hp = getHomepage(params.homepage)
			l.homepage = hp
		}
		
		l.active = true
		if(params.gebucht)
			l.gebucht = true
		else
			l.gebucht = false
		try
		{
			l.eindruck = new Long(params.eindruck)
		}
		catch(Exception e)
		{
			l.eindruck = new Long(0)
		}
		try
		{
			String x = params.kostenVA
			x = x.replaceAll(',','.')
			Double kostenVA = new Double(x)
			l.kostenVA = kostenVA
		}
		catch(Exception e)
		{
			l.kostenVA = new Double(0)
		}
		
		l.eingestelltVon = myuser.key
		l.eingestelltAm = Datehelper.getNow()
		l.feier = myuser.feier
		
		Entity e = l as Entity
		e.save()
		
		createTracer(Konstanten.TRACER_CREATE , "Neue Location eingestellt - "+params.name)
		
		request.message = 'Eintrag erstellt'
		
		index()
	}
}
/**
 * Löscht einen Checklisteneintrag
 */
private void delete()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER);
	String feier = myuser.feier
	
	try
	{
		Key k = KeyFactory.stringToKey(params.key)
		def entity = datastore.get(k);
		if(!entity)
		{
			createTracer(Konstanten.TRACER_UNKNOWN, 'Lokation nicht gefunden zum löschen zum Key: '+k)
		}
		else
		{
			if(entity.feier.equals(feier))
			{
				String message = 'Location gelöscht (auf inaktiv gesetzt): '+entity.key
				createTracer(Konstanten.TRACER_DELETE, message)
				entity.active = false
				entity.save()
			}
			else
			{
				String message = 'Der Benutzer will eine Lokation löschen, die nicht zur eigenen Feier gehört: '+entity.key
				createTracer(Konstanten.TRACER_VERBOTEN, message)
				log.warning('Benutzer '+myuser.anzeigename+' ['+myuser.key+'] hat versucht eine Lokation' +
						' zu löschen, die nicht zur eigenen Feier gehört. Location: '+entity.key)
			}
		}
	}
	//Hier kommt man hin, wenn man am request-parameter params.key selber rumpfuscht
	catch(Exception e)
	{
		String message = 'Der Benutzer will eine Lokation löschen, die es nicht gibt. params.key: '+params.key 
		createTracer(Konstanten.TRACER_VERBOTEN, message)
		log.warning(e.toString())
		log.warning("locations.delete(): Item nicht gefunden zum löschen. Benutzer der gesucht hat: "+myuser+" Params: "+params)
	}
	index()
}

private void update()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER);
	String feier = myuser.feier

	try
	{
		Key k = KeyFactory.stringToKey(params.key)
		def entity = datastore.get(k);
		
		if(!entity)
		{
			createTracer(Konstanten.TRACER_UNKNOWN, 'Lokation nicht gefunden zum updaten zum Key: '+k)
			index()
		}
		else
		{
			if(!params.name)
			{
				request.message = 'Bitte Namen angeben'
				request['item'] =  entity
				forward '/locations/edit.gtpl'
			}
			else
			{
				if(entity.feier.equals(feier))
				{
					boolean changed = false
					
					if(!params.name.equals(entity.name))
					{
						entity.name = params.name
						changed = true
					}
					if(!params.anmerkung.equals(entity.anmerkung))
					{
						entity.anmerkung = params.anmerkung
						changed = true
					}
					if(!params.adresse.equals(entity.adresse))
					{
						entity.adresse = params.adresse
						changed = true
					}
					if(!params.ansprechpartner.equals(entity.ansprechpartner))
					{
						entity.ansprechpartner = params.ansprechpartner
						changed = true
					}
					if(!params.telefon.equals(entity.telefon))
					{
						entity.telefon = params.telefon
						changed = true
					}
					if(!params.homepage.equals(entity.homepage))
					{
						String hp = getHomepage(params.homepage)
						entity.homepage = hp
						changed = true
					}
					if(params.gebucht)
					{
						if(!entity.gebucht)
						{
							entity.gebucht = true
							changed = true
						}
					}
					else
					{
						if(entity.gebucht)
						{
							entity.gebucht = false
							changed = true
						}
					}
					try
					{
						Long eindruck = new Long(params.eindruck)
						if(eindruck != entity.eindruck)
						{
							entity.eindruck = eindruck
							changed = true
						}
					}
					catch(Exception e)
					{
						
					}
					try
					{
						String x = params.kostenVA
						x = x.replaceAll(',','.')
						Double kostenVA = new Double(x)
						if(kostenVA != entity.kostenVA)
						{
							entity.kostenVA = kostenVA
							changed = true
						}
					}
					catch(Exception e)
					{
					}
					if(changed)
					{
						entity.save()
						request['message'] = 'Location erfolgreich aktualisiert'
					}
					request['item'] =  entity
					forward '/locations/edit.gtpl'
				}
				else
				{
					String message = 'Der Benutzer will eine Lokation updaten, die nicht zur eigenen Feier gehört: '+entity.key
					createTracer(Konstanten.TRACER_VERBOTEN, message)
					log.warning('Benutzer '+myuser.anzeigename+' ['+myuser.key+'] hat versucht eine Lokation' +
							' zu updaten, die nicht zur eigenen Feier gehört. Location: '+entity.key)
					index()
				}
			}
		}
	}
	//Hier kommt man hin, wenn man am request-parameter params.key selber rumpfuscht
	catch(Exception e)
	{
		String message = 'Der Benutzer will eine Lokation updaten, die es nicht gibt. params.key: '+params.key 
		createTracer(Konstanten.TRACER_VERBOTEN, message)
		log.warning(e.toString())
		log.warning("locations.edit(): Item nicht gefunden zum updaten. Benutzer der gesucht hat: "+myuser+" Params: "+params)
		index()
	}
}

private void create()
{
	forward '/locations/create.gtpl'
}
private void edit()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER);
	String feier = myuser.feier
	
	try
	{
		Key k = KeyFactory.stringToKey(params.key)
		def entity = datastore.get(k);
		if(!entity)
		{
			createTracer(Konstanten.TRACER_UNKNOWN, 'Lokation nicht gefunden zum editieren zum Key: '+k)
		}
		else
		{
			if(entity.feier.equals(feier))
			{
				request['item'] =  entity
				forward '/locations/edit.gtpl'
			}
			else
			{
				String message = 'Der Benutzer will eine Lokation editieren, die nicht zur eigenen Feier gehört: '+entity.key
				createTracer(Konstanten.TRACER_VERBOTEN, message)
				log.warning('Benutzer '+myuser.anzeigename+' ['+myuser.key+'] hat versucht eine Lokation' +
						' zu editieren, die nicht zur eigenen Feier gehört. Location: '+entity.key)
				index()
			}
		}
	}
	//Hier kommt man hin, wenn man am request-parameter params.key selber rumpfuscht
	catch(Exception e)
	{
		String message = 'Der Benutzer will eine Lokation editieren, die es nicht gibt. params.key: '+params.key 
		createTracer(Konstanten.TRACER_VERBOTEN, message)
		log.warning(e.toString())
		log.warning("locations.edit(): Item nicht gefunden zum editieren. Benutzer der gesucht hat: "+myuser+" Params: "+params)
		index()
	}
}

private void createTracer(String message)
{
	createTracer(Konstanten.TRACER_FORGOT, message);
}
private void createTracer(String type, String message) {
	try
	{
		def myuser = session.getAttribute(Konstanten.SESSION_USER);

		Tracer t = new Tracer()
	    t.ipadresse = request.getRemoteAddr()
	    t.user = myuser.key
	    t.type = type
	    t.nachricht = message
	    t.datum = Datehelper.getNow()
	    Entity e2 = t as Entity
		e2.save()
	}
	catch(Exception e)
	{
		
	}
}
private int getOrder()
{
	private int myorder = -1;
	if(params.order && !params.order.equals('') && !params.order.equalsIgnoreCase('null'))
	{
		try
		{
			String wert = params.order
			int order = (new Integer(wert)).intValue()
			myorder = order * -1
		}
		catch(Exception e)
		{
			e.printStackTrace()
		}
	}
	
	return myorder;
}
private String getHomepage(String hp)
{
	if(!hp.toLowerCase().startsWith('http'))
	{
		hp = "http://"+hp
	}
	return hp
}